package com.dji.sdk.sample.internal.controller;
import android.Manifest;
import android.animation.AnimatorInflater;
import android.animation.LayoutTransition;
import android.animation.ObjectAnimator;
import android.app.SearchManager;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.dji.sdk.sample.R;
import com.dji.sdk.sample.internal.model.ViewWrapper;
import com.dji.sdk.sample.internal.utils.ToastUtils;
import com.dji.sdk.sample.internal.view.DemoListView;
import com.dji.sdk.sample.internal.view.PresentableView;
import com.squareup.otto.Subscribe;
import dji.common.error.DJIError;
import dji.log.DJILog;
import dji.sdk.base.BaseProduct;
import dji.sdk.sdkmanager.DJISDKManager;
import java.util.Stack;
public class MainActivity extends AppCompatActivity {
private FrameLayout contentFrameLayout;
private ObjectAnimator pushInAnimator;
private ObjectAnimator pushOutAnimator;
private ObjectAnimator popInAnimator;
private LayoutTransition popOutTransition;
private Stack<ViewWrapper> stack;
private TextView titleTextView;
private SearchView searchView;
private MenuItem searchViewItem;
private MenuItem hintItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE);
// When the compile and target version is higher than 22, please request the following permissions at runtime to ensure the SDK work well.
if (permissionCheck != 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.VIBRATE,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.WAKE_LOCK,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CHANGE_WIFI_STATE,
Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.SYSTEM_ALERT_WINDOW,
Manifest.permission.READ_PHONE_STATE,
}, 1);
}
DJISampleApplication.getEventBus().register(this);
setContentView(R.layout.activity_main);
setupActionBar();
contentFrameLayout = (FrameLayout) findViewById(R.id.framelayout_content);
initParams();
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
DJISDKManager.getInstance().registerApp(this, new DJISDKManager.SDKManagerCallback() {
@Override
public void onRegister(DJIError djiError) {
DJILog.e("App registration", djiError == null ? "null" : djiError.getDescription());
}
@Override
public void onProductChange(BaseProduct baseProduct, BaseProduct baseProduct1) {
// DO nothing.
}
});
}
@Override
protected void onDestroy() {
DJISampleApplication.getEventBus().unregister(this);
super.onDestroy();
}
private void setupActionBar() {
ActionBar actionBar = getSupportActionBar();
if (null != actionBar) {
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
actionBar.setCustomView(R.layout.actionbar_custom);
titleTextView = (TextView) (actionBar.getCustomView().findViewById(R.id.title_tv));
}
}
private void setupInAnimations() {
pushInAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.slide_in_right);
pushOutAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.fade_out);
popInAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.fade_in);
ObjectAnimator popOutAnimator =
(ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.slide_out_right);
pushOutAnimator.setStartDelay(100);
popOutTransition = new LayoutTransition();
popOutTransition.setAnimator(LayoutTransition.DISAPPEARING, popOutAnimator);
popOutTransition.setDuration(popOutAnimator.getDuration());
}
private void initParams() {
setupInAnimations();
stack = new Stack<ViewWrapper>();
View view = contentFrameLayout.getChildAt(0);
stack.push(new ViewWrapper(view, R.string.activity_component_list));
}
private void pushView(ViewWrapper wrapper) {
if (stack.size() <= 0) return;
contentFrameLayout.setLayoutTransition(null);
View showView = wrapper.getView();
View preView = stack.peek().getView();
stack.push(wrapper);
contentFrameLayout.addView(showView);
pushOutAnimator.setTarget(preView);
pushOutAnimator.start();
pushInAnimator.setTarget(showView);
pushInAnimator.setFloatValues(contentFrameLayout.getWidth(), 0);
pushInAnimator.start();
refreshTitle();
refreshOptionsMenu();
}
private void refreshTitle() {
if (stack.size() > 1) {
ViewWrapper wrapper = stack.peek();
titleTextView.setText(wrapper.getTitleId());
} else if (stack.size() == 1) {
BaseProduct product = DJISampleApplication.getProductInstance();
if (product != null && product.getModel() != null) {
titleTextView.setText("" + product.getModel().getDisplayName());
} else {
titleTextView.setText(R.string.app_name);
}
}
}
private void popView() {
if (stack.size() <= 1) {
finish();
return;
}
ViewWrapper removeWrapper = stack.pop();
View showView = stack.peek().getView();
View removeView = removeWrapper.getView();
contentFrameLayout.setLayoutTransition(popOutTransition);
contentFrameLayout.removeView(removeView);
popInAnimator.setTarget(showView);
popInAnimator.start();
refreshTitle();
refreshOptionsMenu();
}
private void refreshOptionsMenu() {
if (stack.size() == 2 && stack.peek().getView() instanceof DemoListView) {
searchViewItem.setVisible(true);
} else {
searchViewItem.setVisible(false);
searchViewItem.collapseActionView();
}
if (stack.size() == 3 && stack.peek().getView() instanceof PresentableView) {
hintItem.setVisible(true);
} else {
hintItem.setVisible(false);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the options menu from XML
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchViewItem = menu.findItem(R.id.action_search);
hintItem = menu.findItem(R.id.action_hint);
searchView = (SearchView) searchViewItem.getActionView();
// Assumes current activity is the searchable activity
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
DJISampleApplication.getEventBus().post(new SearchQueryEvent(""));
return false;
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
DJISampleApplication.getEventBus().post(new SearchQueryEvent(query));
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
DJISampleApplication.getEventBus().post(new SearchQueryEvent(newText));
return false;
}
});
// Hint click
hintItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
showHint();
return false;
}
});
return true;
}
private void showHint() {
if (stack.size() != 0 && stack.peek().getView() instanceof PresentableView) {
ToastUtils.setResultToToast(((PresentableView) stack.peek().getView()).getHint());
}
}
@Override
public void onBackPressed() {
if (stack.size() > 1) {
popView();
} else {
super.onBackPressed();
}
}
public static class SearchQueryEvent {
private final String query;
public SearchQueryEvent(String query) {
this.query = query;
}
public String getQuery() {
return query;
}
}
public static class RequestStartFullScreenEvent {
}
public static class RequestEndFullScreenEvent {
}
@Subscribe
public void onReceiveStartFullScreenRequest(RequestStartFullScreenEvent event) {
getSupportActionBar().hide();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Subscribe
public void onReceiveEndFullScreenRequest(RequestEndFullScreenEvent event) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
getSupportActionBar().show();
}
@Subscribe
public void onPushView(final ViewWrapper wrapper) {
runOnUiThread(new Runnable() {
@Override
public void run() {
pushView(wrapper);
}
});
}
@Subscribe
public void onConnectivityChange(DJISampleApplication.ConnectivityChangeEvent event) {
runOnUiThread(new Runnable() {
@Override
public void run() {
refreshTitle();
}
});
}
}